iT邦幫忙

2026 iThome 鐵人賽

DAY 9
0
Build on Google AI

Build on Google AI :長者照護 —— 口腔機能訓練 與 延緩認知退化系列 第 9 篇

少年,我看你面相不錯。你聽過 Google MediaPipe Face Landmarker 嗎?(中)

  • 分享至 

  • xImage
  •  

一、前言

昨天我們已經認識:
「 Google MediaPipe Face Landmarker 究竟師出何門?有哪些師兄弟們?」

今天我們進一步來觀察這位俠客 Face Landmarker 的絕技三式,
也就是模型輸出的三種結果:「Face Landmarks 、Blendshapes、Facial Transformation Matrix」。


二、概覽

從官方下載的 face_landmarker .task 其實是個 zip ,內部構成是三個 tflite 模型+一個幾何設定檔:face_detector.tflite、face_landmarks_detector.tflite、face_blendshapes.tflite、geometry_pipeline_metadata_landmarks.binarypb。

名稱 用途 固定輸出 健口動一動用在哪
Face Landmarks 臉部特徵點 臉上 478 個點在哪裡? true 嘴巴開合比例、閉唇偵測、頭部姿勢粗估、畫面標記
Blendshapes 表情係數 現在做什麼表情、多用力? false 嘟嘴、張嘴、「衣」嘴型評分
Facial Transformation Matrix 臉部變換矩陣 頭在 3D 空間的姿勢? false 目前未啟用

三、Face Landmarks 臉部特徵點

第一式是基本功:臉上 478 個點的座標,後面兩式都建立在它上面。

(一)模型輸出:

屬性 Swift 型別 說明
faceLandmarks [[NormalizedLandmark]] 外層每張臉,內層 478 個點
x Float 除以影像寬,範圍 0~1
y Float 除以影像高,範圍 0~1
z Float 深度,越小越靠近鏡頭
visibility NSNumber? 是否可見(Optional)
presence NSNumber? 是否在畫面內(Optional)

官方文件對座標的定義是:x、y 分別以影像寬、高正規化;z 表示相對深度,數值越小越靠近鏡頭,其大小尺度與 x 大致相同。

(二)特別注意:

  • 模型只回傳 478 個點的座標,不會標示哪一點是嘴角或嘴唇。要取特定部位,得用索引到陣列裡取值,例如 landmarks[61]。索引可以從官方連線定義 FaceLandmarker.lipsConnections() 或全尺寸編號圖查得。
  • x、y 分別除以影像的寬和高,影像不是正方形時,直接用正規化座標算距離會變形,必須先把 y 乘上高寬比再計算。

四、Blendshapes 表情係數

第二式是察顏觀色:不問點在哪,直接告訴你臉上每塊肌肉動作的「力道」。

(一)模型輸出:

屬性 欄位 說明
faceBlendshapes [Classifications] 每張臉一個,沒開啟時為空陣列
Classifications headIndex: Int 分類頭編號
headName: String? 分類頭名稱
categories: [ResultCategory] 真正的資料
ResultCategory index: Int 類別編號
score: Float 係數,0~1
categoryName: String? 名稱,例如 jawOpen
displayName: String? 顯示名稱

Classifications 代表一個分類頭的結果,實際的預測類別放在 categories 陣列裡。ResultCategory 包含標籤、顯示名稱、分數,以及標籤在標籤檔中的索引。

(二)特別注意:

  • cheekPuff 幾乎沒反應,這是我有踩過的坑。在做prototype時,想要拿雙頰鼓起的值,但幾乎拿不到。也有人回報 issue 給官方。

五、Facial Transformation Matrix 臉部變換矩陣

第三式是身法:知道這張臉在 3D 空間中怎麼轉、離鏡頭多遠。

(一)模型輸出:

屬性 欄位 說明
facialTransformationMatrixes [TransformMatrix] 每張臉一個 4×4 矩陣,沒開啟時為空陣列
TransformMatrix rows、columns 列數、行數
data: UnsafeMutablePointer 原始數值
value(atRow:column:) 取指定位置的值

這組矩陣是 4×4,未啟用時預設為空陣列。TransformMatrix 提供 rows、columns、data,以及依列與行取值的方法。

(二)特別注意:

  • 距離只是近似值,只能當相對參考
  • Facial Transformation Matrix 預設是不輸出,需要自行開啟

六、小結

今天我們拆解了 Face Landmarker 的絕技三式:

  • 第一式・基本功|Face Landmarks 臉部特徵點:臉上 478 個點的正規化座標,是後兩式的基礎。取特定部位要靠索引;影像不是正方形時,計算距離前要先校正長寬比例。
  • 第二式・察顏觀色|Blendshapes 表情係數:52 個介於 0~1 的係數,直接反映臉部各部位的動作力道。要留意 cheekPuff 幾乎沒有反應,以及左右是以使用者本人為準。
  • 第三式・身法|Facial Transformation Matrix 臉部變換矩陣:一個 4×4 矩陣,描述頭部在 3D 空間中的旋轉與位置。預設不輸出,距離也只是近似值。

希望這篇能讓大家對 Face Landmarker 多一些認識!


七、預告

今天認識了這位 Face Landmarker 俠客的本事,明天就來看如何正式招攬他入府:

  • 模型導入:模型檔放在哪裡、怎麼打包進 App
  • 原生端橋接:以 Android 為例,看相機、推論、預覽怎麼串在一起
  • 為什麼自己橋接:不直接使用 Flutter 社群套件的理由

感謝有緣看到這裡的你~
希望佛菩薩也祝福你:🌟平安健康 開心順遂🌟
南無觀世音菩薩🍀 南無地藏菩薩🏠 南無阿彌陀佛☀️


上一篇
少年,我看你面相不錯。你聽過 Google MediaPipe Face Landmarker 嗎?(上)
下一篇
少年,我看你面相不錯。你聽過 Google MediaPipe Face Landmarker 嗎?(下)
系列文
Build on Google AI :長者照護 —— 口腔機能訓練 與 延緩認知退化 共 17 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言